package net.jcip.examples.chapter7;

import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.*;

/**
 * CheckForMail
 * <p/>
 * Using a private \Executor whose lifetime is bounded by a method call
 *
 * @author Brian Goetz and Tim Peierls
 */

/**
 * 代码执行流程
 * 初始化 ExecutorService 和 AtomicBoolean。
 * 遍历所有主机，为每个主机提交一个任务到线程池。
 * 任务执行过程中，如果某个主机有新邮件，设置 AtomicBoolean 为 true。
 * 关闭 ExecutorService 并等待所有任务完成，或在超时时间内等待。
 * 返回 AtomicBoolean 的值，表示是否有新邮件。
 */
public class CheckForMail {
    public boolean checkMail(Set<String> hosts, long timeout, TimeUnit unit) throws InterruptedException {
        ExecutorService exec = Executors.newCachedThreadPool();
        //使用 AtomicBoolean 来标识是否有新邮件，因为 AtomicBoolean 是线程安全的，可以在多个线程之间共享。
        final AtomicBoolean hasNewMail = new AtomicBoolean(false);
        try {
            for (final String host : hosts)
                exec.execute(() -> {
                    if (checkMail(host))
                        hasNewMail.set(true);
                    //任务取消：如果某个任务检查到新邮件，可以考虑取消其他任务。
                    //exec.shutdownNow();  // 取消其他任务
                });
        } finally {
            exec.shutdown();
            exec.awaitTermination(timeout, unit);
        }
        return hasNewMail.get();
    }

    private boolean checkMail(String host) {
        // Check for mail
        return false;
    }
}
